package com.cskaoyan._06oop3._05innerclass._06niming;

/**
 * @author Macro_Ray
 * @since 2024/3/14 22:55
 */
public class Test {
    public static void main(String[] args) {

        // 实例化一个Swim对象 并调用swim方法
        Swim swim = new Swim() {
            @Override
            public void swim() {
                System.out.println("游泳");
            }
        };
        swim.swim();



        // 匿名内部类
        new Swim(){
            @Override
            public void swim() {
                System.out.println("重写了游泳的方法");
            }
        };
        // 没有名字的类是大括号内的内容
        // 这个类实现了 Swim()接口，并重写了swim()方法
        // new是创建这个匿名内部类的对象


        // 匿名内部类可以继承其他类
        // 这个类继承了Animal类，并重写了eat()方法
        new Animal(){
            @Override
            public void eat() {
                System.out.println("吃鱼");
            }
        };

        // 匿名内部类应用场景
        // 1. 作为参数传递给方法
        // 2. 作为方法的返回值
        // 3. 作为集合元素
        // 4. 作为线程的run()方法
        // 如果我有一个Dog类只调用method()方法一次，那么我可以用匿名内部类来实现
        method(
                new Animal(){
                    @Override
                    public void eat() {
                        System.out.println("狗吃骨头");
                    }
                }
        );
    }

    public static void method(Animal a){ // Animal a = 子类对象  多态√
        a.eat();   // 编译看左边，运行看右边
    }
}
